package edu.xidian.onlinedocument.utils;

import io.jsonwebtoken.*;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 生成Token的工具类
 */
@Service
public class TokenUtil {
    // 私钥
    // 服务器私钥，不可外泄，最好是存在配置文件中，另外用方法来获取
    private final static String SECRET_KEY = "test";
    // 过期时间，单位为ms，六十分钟
    private final static long TOKEN_EXP = 1000 * 60 * 60;

    public static String createToken(String userNum){
        String token = "";
        token = Jwts.builder()
                // .setId(userNum)      // jwt的id，jwt的唯一标识，设定非重复值可以防止重放攻击
                // .setIssuer()        // jwt签发者
                .setSubject(userNum)     // jwt面向用户，一般放用户的唯一信息
                // .setAudience()      // 接收jwt的一方
                // .claim("role", "user")       // 私有声明
                .setIssuedAt(new Date())        // jwt创建时间
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXP))    // jwt过期时间
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)      // 加密方式+密钥
                .compact();
        return token;
    }

    public static boolean cheackToken(String token){
        try{
            Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
            return true;
        } catch (ExpiredJwtException e){
            return false;
        } catch (Exception e){
            return false;
        }
    }

    public static Claims getAllClaims(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }

    public static String getId(String token) {
        if(TokenUtil.cheackToken(token)){
            return TokenUtil.getAllClaims(token).getId();
        }
        return null;
    }

    public static String getSubject(String token) {
        if(TokenUtil.cheackToken(token)){
            return TokenUtil.getAllClaims(token).getSubject();
        }
        return null;
    }

    public static String getIssuer(String token) {
        if(TokenUtil.cheackToken(token)){
            return TokenUtil.getAllClaims(token).getIssuer();
        }
        return null;
    }

    public static Object getClaim(String token, String claim, Class claimClass) {
        if(TokenUtil.cheackToken(token)){
            return TokenUtil.getAllClaims(token).get(claim, claimClass);
        }
        return null;
    }

    public static Date getCreateTime(String token){
        if(TokenUtil.cheackToken(token)){
            return TokenUtil.getAllClaims(token).getIssuedAt();
        }
        return null;
    }

    public static Date getOutDateTime(String token){
        if(TokenUtil.cheackToken(token)){
            return TokenUtil.getAllClaims(token).getExpiration();
        }
        return null;
    }

    public static String getUserNum(String token) {
        return TokenUtil.getSubject(token);
    }
}
